"""
用户选择文件，并以矩阵的形式返回
主要思想还是使用pandas库下的read函数
"""
# Author: KamTang
# Date:   November  28, 2021

import os
import time

import pandas as pd
import numpy as np
import tkinter as tk
from tkinter import filedialog
import easygui as gui


class KamData(object):
    """
    自定义返回类

    Parameters
        ----------
        data : 数据部分
        path : 路径
    """

    def __init__(self, data, path):
        self.data = data
        self.path = path


def readfile():
    """
    读取文件
    param select_path:文件路径
    return: 根据文件类型，返回数据
    """
    # 开启选择文件窗口
    root = tk.Tk()
    root.withdraw()
    # 获取选择好的文件
    select_path = filedialog.askopenfilename()
    # 获取文件类型（后缀）
    file_type = os.path.splitext(select_path)[1]
    if file_type == ".csv" or file_type == ".txt":
        data = pd.read_csv(select_path, encoding="utf-8")
        res = KamData(data, select_path)
        return res
    elif file_type == ".excel":
        return pd.read_excel(select_path)
    else:
        return "该文件类型暂时无法读取"


def remove_place(path):
    """
    去除文件中的空格


    Parameters
    ----------
    path : 选择的文件路劲

    Returns
    -------
    new_path : 重新生成的文件路径，基于你所选择的文件位置
    """
    # 获取文件路径
    out_path = path.rsplit("/", 1)[0]
    # 获取文件类型
    file_type = os.path.splitext(path)[1]
    f = open(path, 'r+', encoding='utf-8')
    new_f = open(out_path + "/" + time.strftime('%Y%m%d', time.localtime(time.time())) + file_type, 'w',
                 encoding='utf8')
    for line in f.readlines():
        new_str = line.replace(" ", "")
        new_f.write(new_str)
    f.close()
    new_f.close()
    # 使用字符串拼接获取新文件路径
    new_path = out_path + "/" + time.strftime('%Y%m%d', time.localtime(time.time())) + file_type
    print("由于选择的文件数据存在脏数据,现已重新为您生成与您选择文件数据一致的文件，路径为：")
    return new_path


# 自定义异常
class NoneException(Exception):
    pass


def get_conditions(read_file):
    """
    :param read_file: 读取的文件
    :return: 用户选择的条件
    """
    # 获取列数
    columns = read_file.shape[1]
    # 算好瓜与坏瓜的概率
    col = read_file.columns[1:columns]

    # 好瓜、不好的瓜分别是多少
    parameters = read_file[col]
    conditions = {}
    # 使用字典的形式存入各个类别
    for i in col[: columns - 2]:
        conditions[i] = np.unique(parameters[i].values)
    # 获取所有元素下标
    index = conditions.keys()
    # 存入用户选择的类别
    temp = []
    j = 0
    for i in index:
        while j < len(conditions[i]):
            temp.append(gui.choicebox(msg=i, choices=conditions[i], title="请选择特征"))
            break
    for t in range(len(temp)):
        if temp[t] is None:
            raise NoneException("条件存在漏选，无法分析结果。")
        else:
            return temp



